//=============================================================================
// API_Data_Loader.js
// 作者: 豆包编程助手
// 版本: 1.0.0
// 说明: 使RPG Maker MZ通过API接口获取游戏数据
//=============================================================================

/*:
 * @target MZ
 * @plugindesc 通过API接口获取游戏数据和配置
 * @author 豆包编程助手
 * @url 
 * @help API_Data_Loader.js
 * 
 * 这个插件将游戏的数据加载方式改为从API获取，
 * 而非默认的本地文件加载。
 * 
 * 插件参数:
 *   API基础地址 - 所有API请求的基础URL
 *   数据获取超时时间 - 请求超时时间(毫秒)
 *   启用缓存 - 是否缓存已获取的数据
 * 
 * @param baseApiUrl
 * @text API基础地址
 * @desc 所有数据请求的基础URL
 * @default http://localhost:3000/api
 * 
 * @param timeout
 * @text 超时时间(毫秒)
 * @desc 数据请求的超时时间
 * @default 10000
 * @type number
 * 
 * @param enableCache
 * @text 启用缓存
 * @desc 是否缓存已获取的数据
 * @default true
 * @type boolean
 */

(() => {
    const pluginName = "API_Data_Loader";
    const parameters = PluginManager.parameters(pluginName);
    
    // 插件配置
    const Config = {
        baseApiUrl: parameters.baseApiUrl.trim(),
        timeout: parseInt(parameters.timeout) || 10000,
        enableCache: parameters.enableCache === "true"
    };
    
    // 数据缓存
    const DataCache = new Map();
    
    // API请求工具函数
    const apiRequest = async (endpoint) => {
        // 检查缓存
        if (Config.enableCache && DataCache.has(endpoint)) {
            console.log(`从缓存加载数据: ${endpoint}`);
            return Promise.resolve(DataCache.get(endpoint));
        }
        
        const url = `${Config.baseApiUrl}/${endpoint}`;
        console.log(`从API加载数据: ${url}`);
        
        try {
            const controller = new AbortController();
            const timeoutId = setTimeout(() => controller.abort(), Config.timeout);
            
            const response = await fetch(url, {
                method: 'GET',
                signal: controller.signal,
                headers: {
                    'Accept': 'application/json'
                }
            });
            
            clearTimeout(timeoutId);
            
            if (!response.ok) {
                throw new Error(`API请求失败: ${response.status} ${response.statusText}`);
            }
            
            const data = await response.json();
            
            // 存入缓存
            if (Config.enableCache) {
                DataCache.set(endpoint, data);
            }
            
            return data;
        } catch (error) {
            console.error(`加载数据失败 (${url}):`, error);
            // 可以在这里添加错误处理，比如显示错误画面
            throw error;
        }
    };
    
    // 重写数据管理器的加载方法
    const _DataManager_loadDataFile = DataManager.loadDataFile;
    DataManager.loadDataFile = async function(name, src) {
        // 提取数据文件名(不含扩展名)作为API端点
        const endpoint = src.replace(/\.json$/, '');
        
        try {
            // 从API获取数据
            const data = await apiRequest(endpoint);
            
            // 处理获取到的数据
            this.createDataObject(name, data);
            
            // 标记为已加载
            this._databaseFiles.forEach(file => {
                if (file.name === name) {
                    file.loaded = true;
                }
            });
            
            console.log(`数据加载完成: ${name}`);
        } catch (error) {
            console.error(`数据加载失败: ${name}`, error);
            // 可以在这里实现错误恢复机制
        }
    };
    
    // 创建数据对象
    DataManager.createDataObject = function(name, data) {
        const object = window[name] = [];
        object.length = 0; // 确保从0开始索引
        
        // 处理数据，RPG Maker通常从1开始索引
        for (let i = 0; i < data.length; i++) {
            const item = data[i];
            if (item) {
                object[i + 1] = item; // 索引从1开始
            }
        }
    };
    
    // 重写数据库加载完成检查
    const _DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
    DataManager.isDatabaseLoaded = function() {
        // 等待所有数据文件加载完成
        return this._databaseFiles.every(file => file.loaded);
    };
    
    // 重写游戏启动方法，确保异步加载完成
    const _Scene_Boot_start = Scene_Boot.prototype.start;
    Scene_Boot.prototype.start = async function() {
        // 显示加载中状态
        this._loadSprite = new Sprite(new Bitmap(Graphics.width, Graphics.height));
        this._loadSprite.bitmap.fillAll('black');
        this.addChild(this._loadSprite);
        
        this._loadText = new Sprite(new Bitmap(Graphics.width, 48));
        this._loadText.bitmap.fontSize = 24;
        this._loadText.bitmap.drawText('正在从服务器加载数据...', 0, 0, Graphics.width, 48, 'center');
        this._loadText.y = Graphics.height / 2 - 24;
        this.addChild(this._loadText);
        
        // 等待所有数据加载完成
        await new Promise(resolve => {
            const checkLoaded = setInterval(() => {
                if (DataManager.isDatabaseLoaded()) {
                    clearInterval(checkLoaded);
                    resolve();
                }
            }, 100);
        });
        
        // 移除加载画面
        this.removeChild(this._loadSprite);
        this.removeChild(this._loadText);
        
        // 继续原始启动流程
        _Scene_Boot_start.call(this);
    };
    
    // 额外的API请求方法，可以在游戏中调用
    window.ApiClient = {
        // 获取配置数据
        getConfig: async function(configName) {
            return apiRequest(`config/${configName}`);
        },
        
        // 保存游戏进度到服务器
        saveGame: async function(saveId, data) {
            const url = `${Config.baseApiUrl}/saves/${saveId}`;
            return fetch(url, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(data)
            });
        },
        
        // 从服务器加载游戏进度
        loadGame: async function(saveId) {
            return apiRequest(`saves/${saveId}`);
        }
    };
})();
